package com.demos.cqp.dnt.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import javax.annotation.Resource;
import javax.inject.Named;
import javax.sql.DataSource;

import com.demos.cqp.dnt.domain.DVD;
import com.demos.cqp.dnt.domain.Utilisateur;


@Named("default")
public class DerbyJdbcDvdDAO implements DvdthequeDAO 
{

//	@Resource(name="java:comp/env/jdbc/dvdtheque")
	@Resource(mappedName="jdbc/dvdthequeJPA")
	private DataSource ds;
	
	
	private Connection getConnection() throws SQLException {
		return ds.getConnection();
	}

	@Override
	public void enregistrer(DVD dvd, Utilisateur user) throws DAOException {

		String request = "insert into DVD(titre, realisateur, acteur1, acteur2, note, genre, duree, proprietaire) "
				+ " values ( '"
				+ dvd.getTitre()
				+ "','"
				+ dvd.getRealisateur()
				+ "','"
				+ dvd.getActeurs()[0]
				+ "','"
				+ dvd.getActeurs()[1]
				+ "',"
				+ dvd.getNote()
				+ ",'"
				+ dvd.getGenre() 
				+ "'," 
				+ dvd.getDuree() 
				+ ",'"
				+ user.getLogin() 
				+ "')";

		System.out.println("MARequete: " + request);
		Statement stmt = null;
		try (Connection connection = getConnection()) {
			stmt = connection.createStatement();
			stmt.executeUpdate(request);
		} catch (SQLException e) {
			e.printStackTrace();
			throw new PBTechniqueDAOException(
					"Un probl�me technique est survenu lors de l'insertion, veuillez r�essayer svp...");
		}

	}
	
	
	@Override
	public void mettreAJour(DVD dvd) throws DAOException {

		String request = "update DVD "
				+ " set titre='"
				+ dvd.getTitre()
				+ "', realisateur='"
				+ dvd.getRealisateur()
				+ "', acteur1='"
				+ dvd.getActeurs()[0]
				+ "', acteur2='"
				+ dvd.getActeurs()[1]
				+ "', note="
				+ dvd.getNote()
				+ ", genre='"
				+ dvd.getGenre() 
				+ "', duree=" 
				+ dvd.getDuree() 
				+ " where id="
				+ dvd.getId();

		System.out.println("MARequete: " + request);
		Statement stmt = null;
		try (Connection connection = getConnection()) {
			stmt = connection.createStatement();
			stmt.executeUpdate(request);
		} catch (SQLException e) {
			e.printStackTrace();
			throw new PBTechniqueDAOException(
					"Un probl�me technique est survenu lors de l'insertion, veuillez r�essayer svp...");
		}

	}

	@Override
	public List<DVD> rechercher(String titre, Utilisateur user) throws DAOException {

		List<DVD> retDVDs = new ArrayList<DVD>();

		String request = "select id, titre, realisateur, acteur1, acteur2, note, genre, duree from DVD "
				+ "where titre like '%?%'" + "and proprietaire=?";

		PreparedStatement stmt = null;

		try (Connection connection = getConnection()) {
			stmt = connection.prepareStatement(request);
			stmt.setString(1, titre);
			stmt.setString(2, user.getLogin());
			ResultSet rs = stmt.executeQuery();

			while (rs.next()) {
				String genre = rs.getString(7);
				DVD dvd = new DVD(rs.getString(2), rs.getString(3),
						new String[] { rs.getString(4), rs.getString(5) },
						rs.getInt(6), (genre == null || genre.equals("null")? DVD.Genre.NON_RENSEIGNE : DVD.Genre.valueOf(genre)),
						rs.getInt(8));

				dvd.setId(rs.getLong(1));

				retDVDs.add(dvd);
			}
		} catch (SQLException e) {
			e.printStackTrace();
			throw new PBTechniqueDAOException(
					"Un probl�me technique est survenu lors de la recherche, veuillez r�essayer svp...");
		}
		return retDVDs;
	}

	@Override
	public DVD consulter(long dvdId) throws DAOException {

		DVD retDVD = null;

		String request = "select id, titre, realisateur, acteur1, acteur2, note, genre, duree from DVD "
				+ "where id=?";

		PreparedStatement stmt = null;

		try (Connection connection = getConnection()) {
			stmt = connection.prepareStatement(request);
			stmt.setLong(1, dvdId);
			ResultSet rs = stmt.executeQuery();

			while (rs.next()) {
				if (retDVD != null) {
					throw new NoUnicRecordDAOException(
							"Plusieurs enregistrements en base pour un identifiant unique");
				}

				String genre = rs.getString(7);
				retDVD = new DVD(rs.getString(2), rs.getString(3),
						new String[] { rs.getString(4), rs.getString(5) },
						rs.getInt(6), (genre == null || genre.equals("null")? DVD.Genre.NON_RENSEIGNE : DVD.Genre.valueOf(genre)),
						rs.getInt(8));
				retDVD.setId(rs.getLong(1));

			}
		} catch (SQLException e) {
			e.printStackTrace();
			throw new PBTechniqueDAOException(
					"Un probl�me technique est survenu lors de la recherche, veuillez r�essayer svp...");
		}
		return retDVD;

	}

	@Override
	public List<DVD> charger(Utilisateur user) throws DAOException {
		List<DVD> retDVDs = new ArrayList<DVD>();

		System.out.println("Methode Charger...");
		
		String request = "select id, titre, realisateur, acteur1, acteur2, note, genre, duree from DVD "
				+ "where proprietaire=?";

		PreparedStatement stmt = null;

		try (Connection connection = getConnection()) {
			stmt = connection.prepareStatement(request);
			stmt.setString(1, user.getLogin());
			ResultSet rs = stmt.executeQuery();

			System.out.println("Debut Chargement...");
			while (rs.next()) {
				String genre = rs.getString(7);
				System.out.println("Chargement d un element");
				DVD dvd = new DVD(rs.getString(2), rs.getString(3),
						new String[] { rs.getString(4), rs.getString(5) },
						rs.getInt(6), (genre == null || genre.equals("null")? DVD.Genre.NON_RENSEIGNE : DVD.Genre.valueOf(genre)),
						rs.getInt(8));
				dvd.setId(rs.getLong(1));
				retDVDs.add(dvd);
			}
			System.out.println("Fin Chargement...");
		} catch (SQLException e) {
			e.printStackTrace();
			throw new PBTechniqueDAOException(
					"Un probl�me technique est survenu lors du chargement, veuillez r�essayer svp...");
		}
		return retDVDs;
	}

	@Override
	public void delete(long idDVD) throws DAOException {
		
		System.out.println("D�but suppression...");
		String request = "delete from DVD " + "where id=?";

		PreparedStatement stmt = null;

		try (Connection connection = getConnection()) {
			stmt = connection.prepareStatement(request);
			stmt.setLong(1, idDVD);
			stmt.executeUpdate();

		} catch (SQLException e) {
			e.printStackTrace();
			throw new PBTechniqueDAOException(
					"Un probl�me technique est survenu lors de la recherche, veuillez r�essayer svp...");
		}
		
		System.out.println("Fin suppression...");
		
	}

}
